﻿#define _CRT_SECURE_NO_WARNINGS
// ↑ 将本行在代码放在第一行可以避免 scanf的报错问题（仅在VS编译器里）
//【初识篇】16.休息
//【初识篇】17.操作符
//【初识篇】18.常见关键字简介
//【初识篇】19.课前准备（水）
//20.关键词 typedef、 static


#include<stdio.h>

	//typedefy用法
	typedef unsigned int unit;// typedef 给unsigned int 重命名为 unit，以方便实用
	//	--------------------------

	//static 修饰全局变量
	//先声明外部符号
	extern g_val;
	// 如果在add.c 中给g_val赋值时使用了 static int 将其变成静态全局变量
	// 那么该全局变量的外部链接属性将变为内部链接属性，其他文件不能再使用该全局变量
	//	--------------------------


	//static 修饰局部变量
	void test1() 
		{
		static int a = 1;//static 用于修饰局部变量时，局部变量出了作用于也不会销毁，因为static 改变了变量的存储位置
		a++;
		printf("%d\n", a);
		}
	//	--------------------------

	//static 修饰函数
	//先声明外部函数
	extern int add(int x, int y);
	// 如果在add.c 中给add(int x, int y）使用了 static 修饰 
	// 那么该函数的外部链接属性将变为内部链接属性，其他文件不能再使用该函数
	//	--------------------------


int main()
{
	//	17.1算数操作符
	int a = 7 / 2;
	printf("用/ a=%d\n", a);//除号 是取商，如果除号两端是整数，执行的是整数除法，如果两端有任一为浮点数，则执行浮点数除法
	
	float b = 7 / 2.0 ;
	printf("用/ b=%f\n", b);
	printf("用/ b=%.2f\n", b);

	int c = 7 %2;
	printf("用/ c=%d\n", c); //取模 是取余数,取模操作符两端只能是整数
	//	--------------------------

	//	17.2移位操作符  移位操作符设计二进制计算，后面课程会详细学习
	//	17.3位操作符  位操作符后面课程会详细学习
	//	--------------------------

	//	17.4赋值操作符 
		//= 赋值
	int d = 0;//初始化
	d = 20;// 赋值
	printf("用/ d=%d\n", d);

	d = d + 3;
	printf("d=%d\n", d);
	
	d += 3;// 加等
	printf("d=%d\n", d);

	d = d - 3;
	printf("d=%d\n", d);

	d -= 3;// 减等
	printf("d=%d\n", d);

	int e = 10;
	int f = e++; //++后置是先使用后++  即 f=e  e = e+1
	int g = ++e; //++前置是先++后使用  即 e = e+1 g=e   //-- 的用法同理
	printf("e=%d\n", e);
	printf("f=%d\n", f);
	printf("g=%d\n", g);
	//一些没用到的符号都是后面的课程会学习
	//	--------------------------

	//	--17.一些练习-------------
	//逻辑反 ！ 的一种用法（类型） 
	int a1 = 1;
	if (!a1)
		printf("true\n");
	//强制类型转换 （类型） 的一种用法
	int b1 = (int)3.14; //将浮点型数字3.14强制转换成整形赋值给b1
		printf("b1=%d\n", b1);

	//逻辑与 && 的一种用法（类型） 
		if(a&&b)
			printf("&&true\n");
	//条件操作符  exp1 ？ exp2 ：exp3的用法
		int c1 =	a1 > b1 ? a1 : b1;
			printf("c1(bigger)=%d\n", c1);
	//逗号表达式  exp1 ， exp2 ，exp3 ... expn
			int e1 = a1 + b1;
			int d1 = (b1=e1 + b1, a1=c1++,c1=c1+(--e1), 3 + a1 + b1 + c1 + e1);
			printf("d1(bigger)=%d\n", d1);
	//	--------------------------

	//20.类型重命名 typedef	
			unit num1 = 2;
	// static  
		//1.修饰局部变量（局部变量被存到静态区，扩大了该值的生命周期）|2.修饰全局变量（外部链接属性变为内部链接属性，缩小了作用域）|3.修饰函数
			
			int i = 0;
			while (i < 10)
			{
				test1();
					i++;
			
			}

		printf("%d", g_val);
		int z = add(a, b);
		printf("%d", z);
	//	--------------------------



	return 0;
}




//17.操作符：c语言中有很多操作符，要灵活使用
	//	17.1算数操作符  + 加 | - 减 | * 乘 | / 除 | % 取模
	//	17.2移位操作符  >> 左移 | << 右移  
	//	17.3位操作符    & 与 | ^ 亦或  | || 或
	//	17.4赋值操作符  = 赋值 | += | -= | *= | /= | &= | ^= |  |= | >>= | <<=
	//	17.5单目操作符  ! 逻辑反 -负值 +正值 &取地址 sizeof操作数的类型长度（以字节为单位） ~对一个数的二进制按位取反 
	//					--前置，后置--  ++ 前置 =，后置++   *间接访问操作符  （类型） 强制类型转换
	//	17.6关系操作符  > | >= | < | <= | != | == | ^= |  |= | >>= | <<=
	//	17.7逻辑操作符  &&逻辑与 | ||逻辑或 
	//	17.8条件操作符  exp1 ？ exp2 ：exp3   1为真计算2 不计算3 | 1为假 不计算2 计算3 
	//	17.9逗号表达式  exp1 ， exp2 ，exp3 ... expn  表达式是从左向右依次计算，整个表达式的结果是最后一个表达式的结果 
	//	17.10下标引用、函数调用和结构成员操作符
	//			[]    |    ()     |  “.”、“-> ”  //这两个以后会学习
	//          []在数组中调用下标 如 arr[9] 即 名称为arr的数组中下标为9的元素的值
	//					   ()在函数汇总调用值，如写好一个函数 调用的时候写为 fx（a，b），即调用函数 将 a 和 b 的值带入函数计算并输出结果
	//	--------------------------
//18.常见关键字简介(C语言内置的)  在定义一些变量的时候不能和关键字重名
	//auto 自动| break 跳出循环|return 返回 |case  等 后面都会学到|
// 循环 for whie  do while  break  continue 
//条件  if else switch case default 
//内置类型 char short int long float double 
//常属性 const 修饰变量，表示常属性
//自定义的 enum枚举 struct结构体 union联合体（共用体）
//声明外部符号extern
//寄存器 register  signed 有符号的  unsigned 无符号的
// static 静态的。。。。。。
// 变量的命名规则， 1.有意义 2.必须是字母、数字、下划线组成，不能有特殊字母、不能以数字开头
//19.课前准备（水）
//20.关键词 typedef、 static

